#ifndef __LCD_H__
#define __LCD_H__

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>

#define BLACK 0x00000000  // 黑色
#define RED 0x00ff0000    // 红色
#define GREEN 0x0000ff00  // 绿色
#define YELLOW 0x00ffff00 // 黄色
#define BLUE 0x000000ff   // 蓝色
#define PURPLE 0x00ff00ff // 紫色
#define CYAN 0x0000ffff   // 青色
#define WHITE 0xffffffff  // 白色
#define WHITE1 0x00ffffff // 白色
#define GRAY 0x00808080   // 灰色
#define PINK 0x00ff8080   // 粉色
#define ORANGE 0x00ff8000 // 橙色

typedef int (*LCDBuffer)[800]; // 定义LCD缓冲区类型

/// @brief  初始化LCD
/// @return FILE * 返回LCD文件指针
static inline FILE *lcd_init()
{
    FILE *fp_lcd = NULL;
    fp_lcd = fopen("/dev/fb0", "r+");
    if (fp_lcd == NULL)
    {
        perror("lcd_fopen");
    }
    else
    {
        printf("open lcd success\n");
    }
    return fp_lcd;
}

/// @brief 映射LCD文件到内存
/// @param fp_lcd
/// @return LCDBuffer 返回LCD内存映射指针
static inline LCDBuffer lcd_mmap_init(FILE *fp_lcd)
{
    // 从FILE指针获取文件描述符
    int fd_lcd = fileno(fp_lcd);
    if (fd_lcd < 0)
    {
        perror("fileno");
    }

    // 映射文件到内存
    LCDBuffer lcd_mmap = (LCDBuffer)mmap(NULL, 800 * 480 * 4, PROT_READ | PROT_WRITE, MAP_SHARED, fd_lcd, 0);

    printf("mmap success\n");
    memset(lcd_mmap, 0, 800 * 480 * 4);

    return lcd_mmap;
}

/// @brief 关闭文件指针，释放内存映射
/// @param fp_lcd   LCD文件指针
/// @param lcd_mmap LCD显示缓冲区指针
static inline void free_lcd(FILE *fp_lcd, LCDBuffer lcd_mmap)
{
    munmap(lcd_mmap, 800 * 480 * 4);
    fclose(fp_lcd);
}

#endif